import re
from functools import reduce

s1 = 'abc_2322ef'
s2 = 'ab{[]]-;,f'

# 匹配正确的用户名
# 账号要求：
# 1.用户名只能包含数字 字母 下划线
# 2.不能以数字开头
# 3.⻓度在 6 到 16 位范围内
# 注意：{5, 15}里面不能有空格
print(re.match(r'^[a-zA-Z]\w{5,15}$', s1))
# \w 等价于[a-zA-Z0-9_] 与 \W相反


# 匹配密码
# 密码要求：
# 1.不能包含!@#¥%^&*这些特殊符号 （不能包括这个写法 [^!@#¥%^&*]）
# 2.必须以字母开头
# 3.⻓度在 6 到 12 位范围内
print(re.match(r'^[a-zA-Z][^!@#¥%^&*]{5,11}$', s2))

# 匹配qq号码
s3 = '100023214'
# 要求： QQ号码的长度一般是5~11位， 全部都是数字，第一位不能是0
print(re.match(r'^[1-9]\d{4,10}$', s3))

# 匹配合法的Python源代码文件
# 要求： python文件名是一个整体，包含字母，数字和下划线_ 。
s4 = '1.py 2.png ssx.csv qaq.txt xzq.py'
res = re.findall(r'\b\w+\.py\b', s4)
print(res)
# \b 成对出现， 含义：单词的结束结尾


# 匹配邮箱地址
# 要求：邮箱地址验证，必须是网易邮箱或者是QQ邮箱。邮箱地址中必须有@，而且@符号前面至少5位，最多18位。
# @126 @163 @qq  结尾 .com .cn
s5 = '232323@qq.cn'
print(re.search(r'^[a-zA-Z|1-9]\w{4,17}@(qq|126|163)\.(com|cn)$', s5))
# 这个有瑕疵。qq邮箱没有cn结尾的。



# 匹配电话号码
# 要求：座机号码必须是：区号-号码，而且区号包含3或者4位，号码一定是8位
s6 = '0731-34345323'
print(re.search(r'^[0-9]\d{3,4}-\d{8}$', s6))
# 实际中，有7位的做记号，区号也有3位的
# 应该如下：
# print(re.search(r'^[0-9]\d{3,4}-\d{7,8}$', s6))


# 提取标签中的内容
# s7 = '<html>hello</h1>'
# 要求：只提取合法标签中的内容，标签不要
s7 = '<html>sfesfeg23</html>'
# 思路:1，先将合法的标签匹配出来，然后取出合法标签中的内容，可以通过下标
# .：匹配任意单个字符（除了换行符 \n）。
# *：量词，表示前面的字符或子表达式可以重复 0 次或多次。
# ?：将贪婪的量词（如 * 或 +）变为 非贪婪模式（也称为最小匹配模式）。
# +：出现一次或多次。
# 方式一：
res1 = re.match(r'<(\w+)>(.+)</\1>$', s7)
print(res1)
print(res1.group(2))
# 方式二：
result = re.match(r'<(?P<my_name>\w+)>(?P<msg>.+)</(?P=my_name)>$', s7)
print(result)
print(result.group(2))
print(result.group('msg'))

# # 提取数字（包括前面的符号）, 并累加求和
s8 = '-3.14good87nice19bye-6.18'
# 邀请：提取一个包含有数值的字符串中的数值 (数值包括正负数， 还包括整数和小数在内) 并求和。
# 例如:“-3.14good87nice19bye” =====> -3.14 + 87 + 19 = 102.86
numbers = re.findall(r'-?\d+\.?\d+', s8)

print(numbers) # ['-3.14', '87', '19', '-6.18']
print(reduce(lambda x, y: x + float(y), numbers,0)) # 96.68


s10 = '1.py 2.png ssx.csv qaq.txt xzq.py 测试.py 我的.py'
print(re.findall(r'\b[\u4e00-\u9fa5]+.py\b', s10))
print(re.findall(r'测试', s10))

